﻿Imports SistemaINCA.Security

Namespace Models

    Public Interface IPeriodos

        <Authorize(Roles:="ERA")> _
        Function GetPeriodoActivo_Informacion() As GET_PACTIVO_INFO_DATATYPE

        <Authorize(Roles:="ERA")> _
        Function GetUltimoPeriodo_Y_SiguientePeriodo() As GET_LASTPERIODO_AND_NEXTPERIODO_DATATYPE

        <Authorize(Roles:="ERA")> _
        Function IsPeriodoReprobados() As Boolean

        <Authorize(Roles:="ERA")> _
        Function Operacion_CerrarPeriodoActivo(ByRef msgError As String) As Boolean

        <Authorize(Roles:="ERA")> _
        Function Operacion_AbrirNuevoPeriodo(FechaCierre As Date, ByRef msgError As String) As Boolean

        <Authorize(Roles:="ERA")> _
        Function GetPeriodos_ByAño(Año As String) As List(Of GET_PERIODOS_BY_ANIO_DATATYPE)

        '<Authorize(Roles:="ERA")> _
        'Function ExistsPeriodosByAño(Año As String) As Boolean

        '<Authorize(Roles:="ERA")> _
        'Function GetPeriodoActivo() As String

        '<Authorize(Roles:="ERA")> _
        'Function OperacionDesactivarPeriodoActivo(ByRef msgError As String) As Boolean

        '<Authorize(Roles:="ERA")> _
        'Function GetListaPeriodos() As IEnumerable(Of GroupListItem)

        '<Authorize(Roles:="ERA")> _
        'Function OperacionActivarPeriodo(Año As String, Periodo As String, ByRef msgError As String) As Boolean

        '<Authorize(Roles:="ERA")> _
        'Function InsertNewPeriodos(Año As String, NoPeriodos As Integer, ByRef msgError As String) As Boolean
    End Interface

    Partial Public Class SchoolClickDB_Repositorio
        Implements IPeriodos

        Public ReadOnly Property IPeriodos() As IPeriodos
            Get
                Return DirectCast(Me, IPeriodos)
            End Get
        End Property

        Private Function GetPeriodoActivo_Informacion() As GET_PACTIVO_INFO_DATATYPE Implements IPeriodos.GetPeriodoActivo_Informacion
            Try
                Using cnn As New SchoolClickEntities
                    Return cnn.GET_PACTIVO_INFO(EncryptationSchoolClick.ToStringInseguro(EncryptationSchoolClick.DesencriptarData(ConfigurationManager.AppSettings("Rol_ERA")))).SingleOrDefault
                End Using
            Catch ex As Exception
                Throw New ApplicationException("No se pudo recuperar la información del periodo activo del sistema.")
            End Try
        End Function

        Private Function GetUltimoPeriodo_Y_SiguientePeriodo() As GET_LASTPERIODO_AND_NEXTPERIODO_DATATYPE Implements IPeriodos.GetUltimoPeriodo_Y_SiguientePeriodo
            Try
                Using cnn As New SchoolClickEntities
                    Return cnn.GET_LASTPERIODO_AND_NEXTPERIODO(EncryptationSchoolClick.ToStringInseguro(EncryptationSchoolClick.DesencriptarData(ConfigurationManager.AppSettings("Rol_ERA")))).SingleOrDefault
                End Using
            Catch ex As Exception
                Throw New ApplicationException("No se pudo recuperar la información del ultimo periodo activado en el sistema, así como el próximo periodo que debería ser activado.", ex)
            End Try
        End Function

        Private Function IsPeriodoReprobados() As Boolean Implements IPeriodos.IsPeriodoReprobados
            Try
                Using cnn As New SchoolClickEntities
                    Return cnn.IS_PERIODO_REPROBADOS(EncryptationSchoolClick.ToStringInseguro(EncryptationSchoolClick.DesencriptarData(ConfigurationManager.AppSettings("Rol_ERA")))).SingleOrDefault
                End Using
            Catch ex As Exception
                Throw New ApplicationException("No se pudo determinar si estamos en periodos de reprobados o ya se cerró el periodo.", ex)
            End Try
        End Function

        Private Function Operacion_CerrarPeriodoActivo(ByRef msgError As String) As Boolean Implements IPeriodos.Operacion_CerrarPeriodoActivo
            Dim eCompleted As Boolean = False
            Using cnn As New SchoolClickEntities
                Try
                    Dim bResult = cnn.OP_CLOSE_PERIODO_ACTIVO(EncryptationSchoolClick.ToStringInseguro(EncryptationSchoolClick.DesencriptarData(ConfigurationManager.AppSettings("Rol_ERA")))).Single
                    If bResult Then eCompleted = True Else msgError = "Ocurrió un error al intentar cerrar el periodo escolar"
                Catch ex As EntityCommandExecutionException
                    msgError = ex.InnerException.Message
                    ex.Data.Clear()
                Catch ex As Exception
                    msgError = FormatErrorMessage("Lo sentimos, ocurrió un error inesperado en el proceso.", ex.Message)
                    ex.Data.Clear()
                End Try
            End Using
            Return eCompleted
        End Function

        Private Function Operacion_AbrirNuevoPeriodo(FechaCierre As Date, ByRef msgError As String) As Boolean Implements IPeriodos.Operacion_AbrirNuevoPeriodo
            Dim eCompleted As Boolean = False
            Using cnn As New SchoolClickEntities
                Try
                    Dim bResult = cnn.OP_OPEN_PERIODO(EncryptationSchoolClick.ToStringInseguro(EncryptationSchoolClick.DesencriptarData(ConfigurationManager.AppSettings("Rol_ERA"))), FechaCierre).Single
                    If bResult Then eCompleted = True Else msgError = "Ocurrió un error inesperado al intentar abrir el nuevo periodo en el año escolar"
                Catch ex As EntityCommandExecutionException
                    msgError = ex.InnerException.Message
                    ex.Data.Clear()
                Catch ex As Exception
                    msgError = FormatErrorMessage("Lo sentimos, ocurrió un error inesperado en el proceso.", ex.Message)
                    ex.Data.Clear()
                End Try
            End Using
            Return eCompleted
        End Function

        Private Function GetPeriodos_ByAño(Año As String) As List(Of GET_PERIODOS_BY_ANIO_DATATYPE) Implements IPeriodos.GetPeriodos_ByAño
            Try
                Using cnn As New SchoolClickEntities
                    Return cnn.GET_PERIODOS_BY_ANIO(Año).ToList
                End Using
            Catch ex As Exception
                Throw New ApplicationException("Ocurrió un error inesperado al intentar recuperar los periodos del Año Escolar especificado.", ex)
            End Try
        End Function

        'Private Function ExistsPeriodosByAño(Año As String) As Boolean Implements IPeriodos.ExistsPeriodosByAño
        '    Try
        '        Using cnn As New SchoolClickEntities
        '            Dim p = cnn.PERIODOS.Where(Function(m) m.ANO = Año).Count
        '            Return If(p.Equals(0), False, True)
        '        End Using
        '    Catch ex As Exception
        '        Throw New ApplicationException("No se pudo determinar si existen los registros de periodos del año en curso.")
        '    End Try
        'End Function

        'Private Function OperacionDesactivarPeriodoActivo(ByRef msgError As String) As Boolean Implements IPeriodos.OperacionDesactivarPeriodoActivo
        '    Dim eCompleted As Boolean = False
        '    Using cnn As New SchoolClickEntities
        '        Try
        '            Dim bResult = cnn.DESACTIVAR_PERIODO_ACTIVO(EncryptationSchoolClick.ToStringInseguro(EncryptationSchoolClick.DesencriptarData(My.Resources.PasswordsEncrypts.ERA_ROL))).Single
        '            If bResult Then
        '                eCompleted = True
        '            Else
        '                msgError = "No se puede desactivar el periodo activo del sistema."
        '            End If
        '        Catch ex As EntityCommandExecutionException
        '            msgError = ex.InnerException.Message
        '            ex.Data.Clear()
        '        Catch ex As Exception
        '            'OPTIONAL: Si existiera un error durante toda la operacion, unicamente la interceptamos y la ignoramos.
        '            'Solo tomaremos el mensaje del error y lo regresaremos en la variable delo mensaje de error
        '            msgError = FormatErrorMessage(My.Resources.ErrorMessageResources.Error_Update_Data, ex.Message)
        '            ex.Data.Clear()
        '        End Try
        '    End Using
        '    Return eCompleted
        'End Function

        'Private Function GetListaPeriodos() As System.Collections.Generic.IEnumerable(Of GroupListItem) Implements IPeriodos.GetListaPeriodos
        '    Try
        '        Using cnn As New SchoolClickEntities
        '            Dim items = New List(Of GroupListItem)
        '            Dim _año As String
        '            Dim _GroupItems As GroupListItem

        '            'Primero recuperamos todos los años
        '            Dim var = cnn.PERIODOS.Select(Function(p) p.ANO).Distinct.OrderByDescending(Function(p) p).ToList
        '            'Dim var = (From paño In cnn.PERIODOS
        '            '          Order By paño.ANO Descending
        '            '          Select paño.ANO).Distinct.ToList

        '            'Vamos a recorrer cada año devuelto y armarlo como grupo para mostrarlo en el ListBox
        '            For Each paño In var
        '                _año = paño
        '                _GroupItems = New GroupListItem
        '                _GroupItems.Nombre = paño
        '                _GroupItems.Items = New List(Of GroupOptionItem)

        '                'Realizamos la consulta para obtener los periodos de ese año
        '                Dim per = (From pper In cnn.PERIODOS
        '                           Where pper.ANO = _año
        '                           Order By pper.PERIODO1 Ascending
        '                           Select pper).ToList
        '                'Recorremos todos los periodos devueltos
        '                For Each pperiodo In per
        '                    _GroupItems.Items.Add(New GroupOptionItem With {.Text = String.Format("{0} - {1}", pperiodo.PERIODO1, _año), _
        '                                                                    .Value = String.Format("{0}-{1}", pperiodo.PERIODO1, _año)})
        '                Next

        '                'Agregamos el nuevo grupo a la lista de items
        '                items.Add(_GroupItems)
        '            Next

        '            'Dim var = cnn.PERIODOS.OrderByDescending(Function(p) p.ANO).ThenBy(Function(p) p.PERIODO1).ToList

        '            'Dim items As IEnumerable(Of SelectListItem) = 
        '            'Return var.Select(Function(p) New SelectListItem With {.Text = String.Format("{0} - {1}", p.PERIODO1, p.ANO), _
        '            '                                                       .Value = String.Format("{0} - {1}", p.PERIODO1, p.ANO)})
        '            Return items
        '        End Using
        '    Catch ex As Exception
        '        Throw New ApplicationException("No se pudo recuperar la lista de periodos del sistema.")
        '    End Try
        'End Function

        'Private Function OperacionActivarPeriodo(Año As String, Periodo As String, ByRef msgError As String) As Boolean Implements IPeriodos.OperacionActivarPeriodo
        '    Dim eCompleted As Boolean = False
        '    Using cnn As New SchoolClickEntities
        '        Try
        '            Dim bResult = cnn.ACTIVAR_NUEVO_PERIODO(Año, Periodo, _
        '                                                    EncryptationSchoolClick.ToStringInseguro(EncryptationSchoolClick.DesencriptarData(My.Resources.PasswordsEncrypts.ERA_ROL))).Single
        '            If bResult Then
        '                eCompleted = True
        '            Else
        '                msgError = "No se ha podido activar el periodo."
        '            End If
        '        Catch ex As EntityCommandExecutionException
        '            msgError = ex.InnerException.Message
        '            ex.Data.Clear()
        '        Catch ex As Exception
        '            'OPTIONAL: Si existiera un error durante toda la operacion, unicamente la interceptamos y la ignoramos.
        '            'Solo tomaremos el mensaje del error y lo regresaremos en la variable delo mensaje de error
        '            msgError = FormatErrorMessage(My.Resources.ErrorMessageResources.Error_Update_Data, ex.Message)
        '            ex.Data.Clear()
        '        End Try
        '    End Using
        '    Return eCompleted
        'End Function

        'Private Function InsertNewPeriodos(Año As String, NoPeriodos As Integer, ByRef msgError As String) As Boolean Implements IPeriodos.InsertNewPeriodos
        '    Dim eCompleted As Boolean = False
        '    Using cnn As New SchoolClickEntities
        '        Try
        '            Dim bResult = cnn.INS_NEW_PERIODOS(NoPeriodos, Año, _
        '                                                    EncryptationSchoolClick.ToStringInseguro(EncryptationSchoolClick.DesencriptarData(My.Resources.PasswordsEncrypts.ERA_ROL))).Single
        '            If bResult Then
        '                eCompleted = True
        '            Else
        '                msgError = "No se pudo crear los nuevos periodos en el sistema."
        '            End If
        '        Catch ex As EntityCommandExecutionException
        '            msgError = ex.InnerException.Message
        '            ex.Data.Clear()
        '        Catch ex As Exception
        '            'OPTIONAL: Si existiera un error durante toda la operacion, unicamente la interceptamos y la ignoramos.
        '            'Solo tomaremos el mensaje del error y lo regresaremos en la variable delo mensaje de error
        '            msgError = FormatErrorMessage(My.Resources.ErrorMessageResources.Error_Update_Data, ex.Message)
        '            ex.Data.Clear()
        '        End Try
        '    End Using
        '    Return eCompleted
        'End Function
    End Class
End Namespace
